﻿using System;
using System.IO;
using System.Web;
using System.Collections.Generic;
using System.Web.SessionState;

using Tizer.Core;
using Tizer.Core.Repository;

namespace Tizer.Web.HttpHandlers
{
    /// <summary>
    /// Summary description for Handler1
    /// </summary>
    public class ImageProcessor : IHttpHandler
    {

        public void ProcessRequest(HttpContext context)
        {
            HttpRequest request = context.Request;
            HttpResponse response = context.Response;

            byte[] imageContent = null;
            int imageWidth = 0;
            int imageHeight = 0;

            //	формируем путь к изображению
            if (request.QueryString["id"] != null)
            {
                int id;
                if (Int32.TryParse(request.QueryString["id"], out id))
                {
                    using (var imageRepository = new ImageRepository())
                    {
                        Image image = imageRepository.GetById(id);
                        if (image != null)
                            imageContent = image.ImageContent;
                    }
                }
            }

            // жесткая ширина и высота картинки
            int.TryParse(request.QueryString["width"], out imageWidth);
            int.TryParse(request.QueryString["height"], out imageHeight);

            if (imageContent != null && imageContent.Length > 0)
            {
                response.ContentType = "image/jpeg";

                //	если переданы размеры изображения, то будем растягивать/сжимать
                if ((imageWidth > 0) || (imageHeight > 0))
                {
                    MemoryStream inputStream = new MemoryStream(imageContent);
                    MemoryStream outputStream = new MemoryStream();

                    ResizeImage(inputStream, outputStream, ref imageWidth, ref imageHeight);

                    response.OutputStream.Write(outputStream.ToArray(), 0, (int)outputStream.Length);
                }
                else
                {
                    response.OutputStream.Write(imageContent, 0, imageContent.Length);
                }
            }
        }

        public bool IsReusable
        {
            get
            {
                return true;
            }
        }

        /// <summary>
        /// Изменяет размер изображения
        /// </summary>
        /// <param name="fromStream">Источник</param>
        /// <param name="toStream">Приемник</param>
        /// <param name="imageWidht">Ширина изображения</param>
        /// <param name="imageHeight">Высота изображения</param>
        private void ResizeImage(Stream fromStream, Stream toStream, ref int imageWidht, ref int imageHeight)
        {
            if ((imageWidht > 0) || (imageHeight > 0))
            {
                System.Drawing.Image image = System.Drawing.Image.FromStream(fromStream);

                //	если высота изображения равна 0, то вычисляем высоту пропорциональную ширине
                if (imageHeight == 0)
                    imageHeight = (int)(image.Height * ((double)imageWidht / (double)image.Width));

                //	если ширина изображения равна 0, то вычисляем ширину пропорциональную высоте
                if (imageWidht == 0)
                    imageWidht = (int)(image.Width * ((double)imageHeight / (double)image.Height));

                //	меняем размер изображения
                System.Drawing.Bitmap thumbnailBitmap = new System.Drawing.Bitmap(imageWidht, imageHeight);

                System.Drawing.Graphics thumbnailGraph = System.Drawing.Graphics.FromImage(thumbnailBitmap);
                thumbnailGraph.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
                thumbnailGraph.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
                thumbnailGraph.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;

                System.Drawing.Rectangle imageRectangle = new System.Drawing.Rectangle(0, 0, imageWidht, imageHeight);
                thumbnailGraph.DrawImage(image, imageRectangle);
                thumbnailBitmap.Save(toStream, image.RawFormat);

                thumbnailGraph.Dispose();
                thumbnailBitmap.Dispose();
                image.Dispose();
            }
        }
    }
}